<?php
/**
 * Created by PhpStorm.
 * User: xmy2
 * Date: 18-8-11
 * Time: 下午11:15
 */

namespace vola;


class Response
{
    public function __construct()
    {
    }

    public  $data = '',
            $code = 0,
            $header = [];

    public function send() {
        $this->http_response_code($this->code);

        if (!empty($this->header)) {
            foreach ($this->header as $head => $v) {
                $this->header($head, $v);
            }
        }

        $this->fastcgi_finish_request($this->convert($this->data));
    }

    public function header($name, $value) {
        header($name . ':' . $value);
    }

    private function convert($data) {
        if (is_array($data)) {
            if (Container::get('env')->get('use_json') === true) {
                return json_encode($data);
            }
            return print_r($data, true);
        }

        if (is_object($data)) {
            if ($data instanceof View) {
                return $data->render();
            }
            return json_encode($data);
        }

        return $data;
    }

    public function head($data, $code = 200, $header = []) {
        $this->header = array_merge($this->header, $header);
        $this->data = $data;
        $this->code = $code;
        return $this;
    }

    public function content_type($type = 'text/html', $charset = 'utf-8') {
        $this->header['Content-type'] = $type.';charset='.$charset;
        return $this;
    }

    private function fastcgi_finish_request($data)
    {
        if (function_exists('fastcgi_finish_request')) {
            echo $data;
            fastcgi_finish_request();
        } else {
            ignore_user_abort(true);            // 客户端关闭程序继续执行
            header('X-Accel-Buffering: no');    // nginx 不缓存输出
            header("Connection: close");
            echo $data;
            ob_end_flush();
            flush();
        }
    }

    public function http_response_code($code = NULL)
    {
        if (function_exists('http_response_code')) {
            return http_response_code($code);
        }
        if ($code !== NULL) {
            switch ($code) {
                case 100:
                    $text = 'Continue';
                    break;
                case 101:
                    $text = 'Switching Protocols';
                    break;
                case 200:
                    $text = 'OK';
                    break;
                case 201:
                    $text = 'Created';
                    break;
                case 202:
                    $text = 'Accepted';
                    break;
                case 203:
                    $text = 'Non-Authoritative Information';
                    break;
                case 204:
                    $text = 'No Content';
                    break;
                case 205:
                    $text = 'Reset Content';
                    break;
                case 206:
                    $text = 'Partial Content';
                    break;
                case 300:
                    $text = 'Multiple Choices';
                    break;
                case 301:
                    $text = 'Moved Permanently';
                    break;
                case 302:
                    $text = 'Moved Temporarily';
                    break;
                case 303:
                    $text = 'See Other';
                    break;
                case 304:
                    $text = 'Not Modified';
                    break;
                case 305:
                    $text = 'Use Proxy';
                    break;
                case 400:
                    $text = 'Bad Request';
                    break;
                case 401:
                    $text = 'Unauthorized';
                    break;
                case 402:
                    $text = 'Payment Required';
                    break;
                case 403:
                    $text = 'Forbidden';
                    break;
                case 404:
                    $text = 'Not Found';
                    break;
                case 405:
                    $text = 'Method Not Allowed';
                    break;
                case 406:
                    $text = 'Not Acceptable';
                    break;
                case 407:
                    $text = 'Proxy Authentication Required';
                    break;
                case 408:
                    $text = 'Request Time-out';
                    break;
                case 409:
                    $text = 'Conflict';
                    break;
                case 410:
                    $text = 'Gone';
                    break;
                case 411:
                    $text = 'Length Required';
                    break;
                case 412:
                    $text = 'Precondition Failed';
                    break;
                case 413:
                    $text = 'Request Entity Too Large';
                    break;
                case 414:
                    $text = 'Request-URI Too Large';
                    break;
                case 415:
                    $text = 'Unsupported Media Type';
                    break;
                case 500:
                    $text = 'Internal Server Error';
                    break;
                case 501:
                    $text = 'Not Implemented';
                    break;
                case 502:
                    $text = 'Bad Gateway';
                    break;
                case 503:
                    $text = 'Service Unavailable';
                    break;
                case 504:
                    $text = 'Gateway Time-out';
                    break;
                case 505:
                    $text = 'HTTP Version not supported';
                    break;
                default:
                    exit('Unknown http status code "' . htmlentities($code) . '"');
                    break;
            }
            $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
            header($protocol . ' ' . $code . ' ' . $text);
            $GLOBALS['http_response_code'] = $code;

        } else {
            $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);
        }
        return $code;
    }

}
